package com.endoc.plugin

import com.android.build.gradle.AppExtension
import com.android.build.gradle.api.ApplicationVariant
import com.android.build.gradle.api.BaseVariantOutput
import com.android.builder.model.SigningConfig
import org.gradle.api.Plugin
import org.gradle.api.Project


/**
 * 继承Gradle的Plugin,那么他就成了一个插件
 */
class JiaguPlugin implements Plugin<Project> {


    //当项目apply本插件时,此方法就会被调用
    @Override
    void apply(Project project) {
        //创建一个类,字符"jiagu"表示创建的这个类的唯一标识,后续可以通过这个标志去访问此类project.extensions.jiagu
        Jiagu jiaguPlugin = project.extensions.create("jiagu", Jiagu)
        //回调,在gradle配置完成后回调,在解析完build.gradle之后回调
        project.afterEvaluate {//执行自己的东西
            //相当于 project.extensions.create("android", Android);创建了后续就可以通过这个名字来用了
            AppExtension appExtension = project.extensions.android//得到AppExtension这个类,包含了gradle插件编译.gradle得到的属性,即拿到名字为android的这个插件

            //可以把这些代码直接方法app的gradle文件中去运行,因为这是groovy的代码,然后看打印信息
            appExtension.applicationVariants.all {//获得Android变体,对应左边的Builder Variants 因为这里有debug和release版本,所以得到所有的,{}中是闭包,默认把最后一句代码作为返回值,此处是遍历
                ApplicationVariant variant->
                //对应变体(debug/release)的签名配置
                SigningConfig signingConfig = variant.signingConfig
                variant.outputs.all {//遍历,参数为闭包
                    BaseVariantOutput output->//此处BaseVariantOutput表示这个参数的类型
                        File apk =output.outputFile//得到输出的apk
                        //创建加固任务,把刚刚得到的apk进行加固,capitalize的作用是将第一个字母大写,variant.baseName是得到变体名字,此处变体名字就是release和debug
                    JiaguTask jiaguTask = project.tasks.create("jiagu${variant.baseName.capitalize()}", JiaguTask)
                    jiaguTask.jiagu =jiaguPlugin;//给jiaguTask创建一个成员属性赋值,这是groovy,当你赋值后,他会自动帮你创建这样一个成员属性
                    jiaguTask.signingConfig =signingConfig;//设置签名
                    jiaguTask.apk =apk//设置apk
                }
            }
        }
    }
}